package godzilla.ciudad;

import org.json.JSONObject;
import org.json.JSONString;

import godzilla.ciudad.estructuras.Estructura;
import godzilla.ciudad.estructuras.NoSePuedeConstruirAquiException;
import godzilla.ciudad.estructuras.Superficie;

public class Mapa implements JSONString{

	private Plano planoSubterraneo;
	private Plano planoPlantaBaja;
	private ListaDePuntos listaDePuntosConstruidos;
	private ListaDePuntos listaDePuntosSubterraneos;
	
	public Mapa(int ancho, int altura){
		
		planoSubterraneo = new Plano( ancho , altura );
		planoPlantaBaja = new Plano( ancho, altura );
		listaDePuntosConstruidos = new ListaDePuntos();
		listaDePuntosSubterraneos = new ListaDePuntos();
		
	}

	private Mapa() {
		//constructor para JSON
	}

	public void construir(Estructura estructura, Punto punto) throws NoSePuedeConstruirAquiException {

		if (estructura.esSubterranea()) {
			this.planoSubterraneo.construir( estructura , punto );
			this.listaDePuntosSubterraneos.agregar(punto);
		}
			
		else {
			this.planoPlantaBaja.construir( estructura , punto );
			this.listaDePuntosConstruidos.agregar(punto);
		}
			
	}

	public Estructura verEstructuraEn(Punto punto) {

		return this.planoPlantaBaja.verSuperficieEn(punto).estructuraContenida();

	}

	public Estructura verEstructuraSubterraneaEn(Punto punto) {
		
		return this.planoSubterraneo.verSuperficieEn(punto).estructuraContenida();
	}

	public ListaDePuntos listaDePuntosConstruidos() {
		
		return this.listaDePuntosConstruidos;
		
	}

	public ListaDePuntos listaDePuntosSubterraneosConstruidos() {

		return listaDePuntosSubterraneos;
	}

	public int dimensionX() {

		return planoPlantaBaja.dimensionX();
	}
	
	public int dimensionY() {

		return planoPlantaBaja.dimensionY();
	}

	public Superficie verSuperficieEn(Punto punto) {

		return planoPlantaBaja.verSuperficieEn(punto);
		
	}

	public Superficie verSuperficieSubterraneaEn(Punto punto) {

		return planoSubterraneo.verSuperficieEn(punto);
	}

	public void destruirEstructuraEn(Punto punto) {

		planoPlantaBaja.verSuperficieEn(punto).destruirEstructura();
		
	}

	public static Mapa obtenerObjetoDesdeJSON(String string) {
		
		JSONObject objetoJSON = new JSONObject(string);
		Mapa mapaAObtener = new Mapa();
		mapaAObtener.planoPlantaBaja = Plano.obtenerObjetoDesdeJSON(objetoJSON.getJSONObject("PlanoPlantaBaja").toString());
		mapaAObtener.planoSubterraneo = Plano.obtenerObjetoDesdeJSON(objetoJSON.getJSONObject("PlanoSubterraneo").toString());
		mapaAObtener.listaDePuntosConstruidos = new ListaDePuntos();
		mapaAObtener.listaDePuntosSubterraneos = new ListaDePuntos();
		return mapaAObtener;
		
	}

	@Override
	public String toJSONString() {
		
		JSONObject objetoJSON = new JSONObject();
		
		JSONObject objetoPlantaBaja = new JSONObject(this.planoPlantaBaja.toJSONString());
		JSONObject objetoSubterraneo = new JSONObject(this.planoSubterraneo.toJSONString());
		
		objetoJSON.put("PlanoPlantaBaja",objetoPlantaBaja);
		objetoJSON.put("PlanoSubterraneo", objetoSubterraneo);
		
		return objetoJSON.toString();
	}

}
